{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Toy Example\n",
    "\n",
    "This is the sample code to generate a toy example highlighting the effect of task loss weighted MSE."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from gurobi_oracle import GurobiSolver\n",
    "from models import LinearModel\n",
    "from sgd import SGDLearner\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from short_path_oracle import ShortPathOracle\n",
    "import copy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Synthetic Set-Up\n",
    "We'll use a simple 2-path shortest path problem with the following details\n",
    "\n",
    "- One feature x\n",
    "- 2 paths: $c_1(x) = x^2, c_2(x) = e^x$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(0.2,2, 20)\n",
    "c1 = (x+0.5)**3\n",
    "c2 = np.exp(x) + 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAaFUlEQVR4nO3df3DcdZ3H8ec7SUPaEmxsQ2UIIeWsrbVTS2fpiakcgnUqFLnOeNIKyh0/inTO0/M8RZ2RwfFOvHPu0OF6GgoHBS6ASP01/CgiDFIRTUtRpOCJSAlCG0KrpbRN033fH7sbtttsstnv97v7/e6+HjOdTb774/vO9pv3fvL5vD+fj7k7IiKSPA3VDkBERMqjBC4iklBK4CIiCaUELiKSUErgIiIJ1VTJk82YMcO7uroqeUoRkcTbvHnzK+7eXni8ogm8q6uLvr6+Sp5SRCTxzOz50Y6P24ViZjeY2U4ze7Lg+CfM7Bkz+42Z/VtYgYqISGlK6QO/EViWf8DM3gucCyxw93cAXw8/NBERGcu4CdzdHwZeLTh8OXC1ux/IPmZnBLGJiMgYyu0DfxvwHjP7F2A/8Bl3/+VoDzSz1cBqgM7OziPuP3jwIP39/ezfv7/MUGpTS0sLHR0dTJo0qdqhiEhMlZvAm4A24F3AKcAdZnaSj7Kwirv3AD0AqVTqiPv7+/tpbW2lq6sLMysznNri7gwODtLf38+sWbOqHY6IxFS5deD9wF2e8QsgDcwo54X279/P9OnTlbzzmBnTp0/XXyUiNSCddgb2HODFXa8zsOcA6XR4CwiW2wL/HnAG8JCZvQ1oBl4pNwgl7yPpPRFJvnTaeWbHHi5d30f/rn10tE3muo+lmDOzlYaG4L/jpZQR9gKPAnPMrN/MLgZuAE7KlhbeBlw4WveJiEg9G9w7NJK8Afp37ePS9X0M7h0K5fVLqUJZ5e7Hufskd+9w9+vdfcjdL3D3+e6+yN1/Eko0VdLY2MjChQtH/l199dVHPOahhx5i+fLloZzv2muv5a1vfStmxiuvlP2Hi4jE3NDwoZHkndO/ax9Dw4dCef2KzsSMq8mTJ7N169aKna+7u5vly5dz+umnV+ycIlJ5zU2NdLRNPiyJd7RNprmpMZTXT9xiVlEOCBS69957mTt3LkuWLOGuu+4aOT4wMMDSpUtZtGgRl112GSeeeOJIS/qWW25h8eLFLFy4kMsuu4xDh478pD355JPRmjAitW/61Gau+1iKjrbJACN94NOnNofy+olK4LkBgRVrN9H9tQdZsXYTz+zYEziJ79u377AulNtvv539+/dz6aWX8sMf/pCf/vSnvPzyyyOPv+qqqzjjjDPYsmULK1asYPv27QBs27aN22+/nU2bNrF161YaGxu59dZbA8UmIsnV0GDMmdnKhjXdbPrce9mwpju0AUxIWBdKsQGBDWu6aW89quzXHa0LZevWrcyaNYvZs2cDcMEFF9DT0wPAI488woYNGwBYtmwZbW1tADzwwANs3ryZU045Bch8MBx77LFlxyUiydfQYIHy01gSlcCjHhAoVKyUr1jBjbtz4YUX8tWvfjWSeERE8iWqCyU3IJAvzAGBfHPnzuW5557j2WefBaC3t3fkviVLlnDHHXcAsHHjRnbt2gXAmWeeyZ133snOnZmlYV599VWef37UVSBFRAJLVAKPakCgsA/8iiuuoKWlhZ6eHs4++2yWLFnCiSeeOPL4K6+8ko0bN7Jo0SLuuecejjvuOFpbW5k3bx5f+cpXeP/738+CBQtYunQpL7300hHn++Y3v0lHRwf9/f0sWLCASy65JFD8IlKfrJLzb1KplBdu6LBt2zbe/va3l/wa6bQzuHeIoeFDNDc1Mn1qc2gDAqU6cOAAjY2NNDU18eijj3L55ZdHUoY40fdGRGqTmW1291Th8UT1gUO0AwKl2r59Ox/+8IdJp9M0Nzdz3XXXVTUeEalPiUvgcTB79mwef/zxaochInUuUX3gIiLyBiVwEZGEUgIXEUkoJXARkYRSAqfyy8mef/75zJkzh/nz53PRRRdx8ODBUF5XROqLqlCo/HKy559/PrfccgsAH/nIR1i3bh2XX355xc4vIrUheS3wdBpe2wG7X8jcptORnSqq5WTPOusszAwzY/HixfT390f2M4hI7SplS7UbzGxndvu0wvs+Y2ZuZmVtaDxh6TTsfArWvQ+umZ+53flU4CRereVkDx48yM0338yyZcsCxS8i9amULpQbgWuB9fkHzewEYCmwPfywinh9AG5bBbuzp9y9PfP9JT+Go2eW/bLVWk52zZo1nHbaabznPe8pO3YRiVYclu8oZtwE7u4Pm1nXKHf9J/BZ4PthB1XU8NAbyTtn9/bM8QhEuZzsVVddxcDAAN/+9rcDxSgi0Yl6V/mgyuoDN7MPAi+6+xMlPHa1mfWZWd/AwEA5p3tDUzNM6zz82LTOzPGQRbmc7Lp167jvvvvo7e2loSF5wxAi9SLqXeWDmnD2MLMpwBeBL5XyeHfvcfeUu6fa29snerrDTWmHlb1vJPFpnZnvpwR73UovJ/vxj3+cHTt2cOqpp7Jw4UK+/OUvB4pfRKJR6U1kJqqcMsK/AGYBT2S7GDqALWa22N1fHvOZQTU0wLHzMn3ew0OZlveU9szxAEarFIFM//bTTz99xPE3velN3HfffSPLyT744IMcdVRmhcTzzjuP8847b8zzDQ8PB4pXRCoj6l3lg5pwAnf3XwMjI3Nm9gcg5e6vhBhXcQ0NgQYsw6DlZEXqQ24TmcI+8LB2lQ9q3ARuZr3A6cAMM+sHrnT366MOLM60nKxIfcjfVT6pVSirxrm/K2gQ7l604qNeVXKnJBEpLg6byBRT9RKIlpYWBgcHlbDyuDuDg4O0tLRUOxQRibGqr4WS29w3cIlhjWlpaaGjo6PaYYhIjFU9gU+aNIlZs2ZVOwwRkcSpeheKiIiURwlcRCShlMBFRBJKCVxEJKGUwEVEEkoJXEQkoZTARUQSSglcRCShlMBFRBJKCVxEJKGqPpVeRCQqcd6QOAxK4CJSk+K+IXEY1IUiIjUp7hsSh0EJXERqUtw3JA7DuAnczG4ws51m9mTesX83s6fN7FdmtsHMpkUapYjIBOU2JM4Xpw2Jw1BKC/xGYFnBsfuB+e6+APgt8PmQ4xIRCSS3IXEuicdtQ+IwlLIn5sNm1lVwbGPetz8HPhRyXCIigcR9Q+IwhFGFchFwe7E7zWw1sBqgs7MzhNOJiJQmzhsShyHQIKaZfREYBm4t9hh373H3lLun2tvbg5xORETylN0CN7MLgeXAma4t5UVEKq6sBG5my4DPAX/l7q+HG5KIiJSilDLCXuBRYI6Z9ZvZxcC1QCtwv5ltNbNvRRyniIgUKKUKZdUoh6+PIBYREZkAzcQUEUkoJXARkYRSAhcRSSglcBGRhFICFxFJKCVwEZGE0o48IhJbtb4lWlBK4CISS/WwJVpQ6kIRkViqhy3RglICF5FYqoct0YJSAheRWKqHLdGCUgIXkViqhy3RgtIgpojEUj1siRaUEriIxFatb4kWlLpQREQSSglcRCShlMBFRBKqlC3VbjCznWb2ZN6xN5vZ/Wb2f9nbtmjDFBGRQqW0wG8ElhUcuwJ4wN1nAw9kvxcRkQoaN4G7+8PAqwWHzwVuyn59E/DX4YYlIiLjKbcPfKa7vwSQvT222APNbLWZ9ZlZ38DAQJmnExGRQpEPYrp7j7un3D3V3t4e9elEROpGuQl8h5kdB5C93RleSCIiUopyE/gPgAuzX18IfD+ccESklqTTzsCeA7y463UG9hwgnfZqh1RTxp1Kb2a9wOnADDPrB64ErgbuMLOLge3A30QZpIgkjzZkiN64CdzdVxW568yQYxGRGlJsQ4YNa7rra32TdBpeH4DhIWhqhint0BDO8KMWsxKRSGhDBjLJe+dTcNsq2L0dpnXCyl44dl4oSVxT6UUkEtqQgUzLO5e8IXN726rM8RAogYtIJLQhA5luk1zyztm9PXM8BOpCEZFIaEMGMn3e0zoPT+LTOjPHQ6AWuIhEJrchw/FtU2hvPaq+kjdkBixX9maSNrzRBz4lnEmNaoGLiESloSEzYHnJj1WFIiKSOA0NcPTMaF46klcVEZHIqQUuIjKWCCfiBKUELiJSTMQTcYKqfgQiInEV8UScoJTARUSKiXgiTlBK4CIixeQm4uQLcSJOUErgIlJU3a/nHfFEnKA0iCkio9J63kQ+ESeoeEQhIrFTbD3vwb3x6P8tSToNr+2A3S9kbtPpib9GbiLOtBMytzFJ3qAWuIgUkfj1vGNeAhiGQD+Fmf2jmf3GzJ40s14zawkrMBGprsSv5x3zEsAwlJ3Azex44B+AlLvPBxqBlWEFJiLVlfj1vGNeAhiGoF0oTcBkMzsITAH+GDwkEYmDxK/nHfFa3HFQdgvc3V8Evk5mV/qXgD+5+8bCx5nZajPrM7O+gYHa+dNFpB4kej3vmJcAhsHcy6vrNLM24LvAecBu4DvAne5+S7HnpFIp7+vrK+t8IiITFuOFqCbCzDa7e6rweJCf5H3Ac+4+4O4HgbuAdwd4PRGRcMW4BDAMQfrAtwPvMrMpwD7gTEDNaxEJT420oKNSdgJ398fM7E5gCzAMPA70hBWYiNS5OqjjDirQu+DuV7r7XHef7+4fdfcDYQUmInWuDuq4g9LHmIjEUx3UcQelBC5SwxK9mmDMl3KNAyVwkRqVW01wxdpNdH/tQVas3cQzO/YkJ4nXQR13UGXXgZdDdeAilTOw5wAr1m46bEGqjrbJbFjTTXvrUZUJImgViapQgOJ14FqNUKRGVX01wTCqSHJ13DKq+vsoE6kTVV9NUFUkkVMCF6lRVV9NUFUkkVMXikiNqvpqgnWwGmC1qQUuUsOqupqgqkgipxa4iBQXpAok5hsC1wIlcBEZnapIYk8fhSIyOlWRxJ4SuIiMTlUksacELiKj01oksacELhJjgRejSqfhtR2w+4XMbTpd+nNVRRJ7GsQUiancYlSXru+jf9e+kYk4c2a2llYOGHQQUlUksaf/CZGYGtw7NJK8IbOOyaXr+xjcW2IfdBiDkDW+p2TSBfrfMLNpZnanmT1tZtvM7NSwAhOpd4EXo9IgZM0L+nH6DeBed58LvBPYFjwkEYEQFqPSIGTNK7sP3MyOAU4D/hbA3YcAfbSLhGT61GZuvugUXnv1ZaY1p9k91MDRb35L6YtR5QYhC/vANQhZM4IMYp4EDAD/Y2bvBDYDn3T3vfkPMrPVwGqAzs7OI15EREbXgNN16HnsnkwCPmFaJ76yF2MeUMIgpgYha16Q/8kmYBHw3+5+MrAXuKLwQe7e4+4pd0+1t+uTX6Rkrw9gBYOQpkFIyRPkf7Mf6Hf3x7Lf30kmoYtIGDQIKeMoO4G7+8vAC2Y2J3voTOCpUKISEQ1CyriC/j31CeBWM/sVsBD418ARidQSzYSUCAWaienuW4EjdkoWETQTUiKnK0EkKpoJKRHT1SASES8yCOkahJSQKIGLjCVAH/awTRp1EHLYJoUcpNQrJXCRYnJ92OveB9fMz9zufKrkJL6LYxg856bDBiEHz7mJXRwTYdBST5TARYoJ2IdtDY18YdMwm5d+hxcu/AWbl36HL2waxhpKXMtEZBxaD1xqW5Bd1QNOpJk+tZlPLZ17xHreJa9lIjIOJXCpXUHL+HITafKT+AQm0jQ0GHNmtrJhTTdDw4dobmpk+tTm0jZjECmBulCkdgUt4wthIk1Dg9HeehTHt02hvfUoJW8JlVrgUruCriWiiTQSc0rgEm9B+rADdoEAb0ykEYkhNSUkvgKW8WktEal1aoFLfBXrw77kx6W1ikPoAkmnncG9QxqElFhSApdoVbGMDwjUBZJOO8/s2HNEGeCcma1K4hIL6kKR6ATtAqnyetiDe4dGkjdkdoS/dH0fg3u1lonEgxK4RCcGZXxBDA0fGkneOf279jE0fKgi5xcZj7pQZGzV7AKpchlfc1MjHW2TD0viHW2TaW7SVHiJh8C/CWbWaGaPm9mPwghIYiQOXSBVXA97+tRmrvtYio62yQCaCi+xY+4e7AXMPk1mV55j3H35WI9NpVLe19cX6HwyQUFa0K/tyCTtwjrqUqtAgk5ljwFVoUgcmNlmdz9i97NAXShm1gGcDfwL8OkgryURCJpAE94FEobcVHiROAr6m3QN8FlgAju1yoQE2RQ36CBiwrtARGpd2b9NZrYc2Onum8d53Goz6zOzvoGBCewFKMH7oIO2oGtgJmM67QzsOcCLu15nYM8B0ulgXYYicRKkC6Ub+KCZnQW0AMeY2S3ufkH+g9y9B+iBTB94gPMlU5A+6KAzEYOuBZLwLhBNxJFaV/Zvort/3t073L0LWAn8pDB5171aaEEnuAtEE3Gk1qkOfDxqQSeWJuJIrQvlN9ndHxqvhDCR1IJOtNxEnHyaiCO1pPZ/m5NcxZHfgv7Uk5nbBNVQV5sm4kitq+0ulGrXQeda0IXnL6cFLROmPSml1sU/gasPWgLQRBypZfHOJOqDrnuq4xYpLt4tcLWg65rquEXGFu9MpBZ0XVMdt8jY4t0CVwu6rqmOW2Rs8c5kakHXNdVxi4wt3i1wtaDrWq6Ou7APXHXcIhnxTuCgOug6pjpukbHFP4FLXVMdt0hxSuASKW1JJhIdJXCJjOq4RaKl0UCJjOq4RaKlBC6RUR23SLSUwCUyquMWiZYSuERG63GLRKvsQUwzOwFYD7wFSAM97v6NsAKTeAhSRaI6bpFoBalCGQb+yd23mFkrsNnM7nf3p0KKTaosjCoS1XGLRCfIrvQvufuW7Nd7gG3A8WEFJtWnKhKReAulD9zMuoCTgcdGuW+1mfWZWd/AQIl7SUosqIpEJN4CJ3AzOxr4LvApd/9z4f3u3uPuKXdPtbdPYBVBqTpVkYjEW6AEbmaTyCTvW939rnBCkjAF2ZJMVSQi8RakCsWA64Ft7v4f4YUkYQk6CKkqEpF4C9IC7wY+CpxhZluz/84KKS4JQRiDkLkqkuPbptDeepSSt0iMlN0Cd/dHAP02x5gGIUVqm2Zi1jANQorUNiXwmNMgpIgUo/XAY0yDkCIyFrXAY0yDkCIyFiXwGNMgpIiMRQk8YkH6sDUIKSJjUQKPUK4Pe8XaTXR/7UFWrN3EMzv2lJzENQgpImMx99JbhEGlUinv6+ur2PmqbWDPAVas3XRYN0hH22Q2rOkueYlV7eouIma22d1ThcdVhTKOIAk0jD5sractIsUogY8haBlfrg+7sAWuPmwRCYP6wMcQtIxPfdgiEqWab4FXswtEE2lEJEo1ncDj0AWiPmwRiUrsu1CC1FGrC0REalmsW+BBW9DqAhGRWhbrFnjQFnQYMxm1loiIxFWsE3jQFrS6QESklgXqQjGzZcA3gEZgnbtfHUpUWUEHEdUFIiK1rOwWuJk1Av8FfACYB6wys3lhBQbhtKDVBSIitSpIC3wx8Dt3/z2Amd0GnAs8FUZgoBa0iMhYgiTw44EX8r7vB/6y8EFmthpYDdDZ2Tnhk6iOWkRkdEEGMUdrBh9RpO3uPe6ecvdUe3t7gNOJiEi+IAm8Hzgh7/sO4I/BwhERkVIFSeC/BGab2SwzawZWAj8IJywRERlP2X3g7j5sZn8P3EemjPAGd/9NaJGJiMiYAtWBu/vdwN0hxSIiIhNQ0S3VzGwAeD7CU8wAXonw9cOiOMOVlDghObEqzvAFifVEdz+iCqSiCTxqZtY32r5xcaM4w5WUOCE5sSrO8EURa6zXQhERkeKUwEVEEqrWEnhPtQMokeIMV1LihOTEqjjDF3qsNdUHLiJST2qtBS4iUjeUwEVEEioRCdzMlpnZM2b2OzO7YpT7zzezX2X//czM3pl33x/M7NdmttXM+qoc5+lm9qdsLFvN7EulPrcKsf5zXpxPmtkhM3tz9r6KvKdmdoOZ7TSzJ4vcb2b2zezP8CszW1Tqz1eFWONyjY4XZyyu0RLirPr1mT3XCWb2oJltM7PfmNknR3lMdNepu8f6H5lp+s8CJwHNwBPAvILHvBtoy379AeCxvPv+AMyISZynAz8q57mVjrXg8ecAP6nCe3oasAh4ssj9ZwH3kFkZ8125//dKv58lxlr1a7TEOONyjY4ZZxyuz+y5jgMWZb9uBX47yu99ZNdpElrgIxtHuPsQkNs4YoS7/8zdd2W//TmZlRErbdw4I3puOSZ6vlVAb4TxjMrdHwZeHeMh5wLrPePnwDQzO47Kv5/jxhqTa7SU97SYir6nE4yzKtcngLu/5O5bsl/vAbaR2SshX2TXaRIS+GgbRxS+QfkuJvNpl+PARjPbnN1cIiqlxnmqmT1hZveY2Tsm+NywlHw+M5sCLAO+m3e4Uu/peIr9HJV+PyeqWtdoqeJwjZYkTtenmXUBJwOPFdwV2XUaaDGrCilp4wgAM3svmV+OJXmHu939j2Z2LHC/mT2d/XSvRpxbyKxp8JqZnQV8D5hd4nPDNJHznQNscvf81lCl3tPxFPs5Kv1+lqzK12gp4nKNlioW16eZHU3mQ+RT7v7nwrtHeUoo12kSWuAlbRxhZguAdcC57j6YO+7uf8ze7gQ2kPmzpSpxuvuf3f217Nd3A5PMbEYpz610rHlWUvDnaQXf0/EU+zliudlIDK7RccXoGi1V1a9PM5tEJnnf6u53jfKQ6K7TSnT0BxwkaAJ+D8zijY7+dxQ8phP4HfDuguNTgda8r38GLKtinG/hjclTi4HtZD6Fx31upWPNPu5NZPohp1bjPc2eo4viA25nc/jg0C8m8vNVONaqX6MlxhmLa3S8OGN0fRqwHrhmjMdEdp3GvgvFi2wcYWYfz97/LeBLwHRgrZkBDHtm1a+ZwIbssSbgf9393irG+SHgcjMbBvYBKz3zP1nRzTFKjBVgBbDR3ffmPb1i76mZ9ZKpiphhZv3AlcCkvBjvJjPC/zvgdeDvxvr5oohxArFW/RotMc5YXKMlxAlVvj6zuoGPAr82s63ZY18g84Ed+XWqqfQiIgmVhD5wEREZhRK4iEhCKYGLiCSUEriISEIpgYuIJJQSuIhIQimBi4gk1P8DzTqSxB+85FMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(x=x,y=c1, label='Edge 1')\n",
    "sns.scatterplot(x=x,y=c2, label='Edge 2')\n",
    "plt.savefig('ex_figs/base_set-up.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Generate Training Instances"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "tr_instances = []\n",
    "\n",
    "for i in range(len(x)):\n",
    "    weights = np.array([[1,1]])\n",
    "    costs = np.array([c1[i], c2[i]])\n",
    "    \n",
    "    if costs[0] < costs[1]:\n",
    "        opt_sol = np.array([1,0])\n",
    "    else:\n",
    "        opt_sol = np.array([0,1])\n",
    "                          \n",
    "    \n",
    "    instance = {\n",
    "        'c': costs,\n",
    "        'features': np.array([x[i],1]),\n",
    "        'A': weights,\n",
    "        'b': 1,\n",
    "        'var_type': 'integer',\n",
    "        'objective': 'min',\n",
    "        'opt_sol': opt_sol,\n",
    "        'opt_val': min(costs)\n",
    "    }\n",
    "    tr_instances.append(instance)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Least Squares"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using license file /Users/connorlawless/gurobi.lic\n",
      "Academic license - for non-commercial use only\n",
      "avg train loss 4.282096160702475\n"
     ]
    }
   ],
   "source": [
    "learning_params = {\n",
    "    'gradient': 'LS',\n",
    "    'step_size_fn': 'long_dynamic'\n",
    "}\n",
    "learner = SGDLearner(learning_params)\n",
    "oracle = GurobiSolver()\n",
    "LSmodel = LinearModel(2, 2)\n",
    "model_ls = learner.learn(oracle, LSmodel, \n",
    "              tr_instances,\n",
    "              batch_size = len(tr_instances), epochs=50000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Bmsqy7EiUioi9wLPAenOoYWvAHfrUk9KKWWprG1qDW+A0hP13P9iPpW1TT7dT6cBboy51RgzzBgTZYxJMcY8a4xpMsbcYYyZYIyZYozJ82lVARYREcGkSZNav37961+fs8369eu5+uqrfbK/xx9/nIyMDESE48e7/YuLUipENdlbWsPbpfREPU12367HEdArMUNVbGwsO3fuDNj+Zs2axdVXX83cuXMDts+e7IcLxna+kVIBFB0ZQcqA2LNCPGVALNGRET7dT9hNZhWIEwMu77//PhdeeCHZ2dm8+eabrbdXVFRwxRVXMGXKFBYtWsSoUaNaj6RXr17NtGnTmDRpEosWLaKl5dyfuJMnT0bnhPGdqaMGMnXUwGCXoVSrQX2jefquLFIGxAK09sAH9Y326X7CKsBdJwaue2ITs36zjuue2MS+YzVeh3h9ff1ZLZRXX32VhoYG7r//ft555x02bNjA0aNHW7f/6U9/Sk5ODtu3b+e6667j4MGDAOzdu5dXX32VTZs2sXPnTiIiInj55Ze9qk11bltJFdtKqoJdhlKtbDZh7JB43lo8i00/msdbi2f5/AQmhFkLpaMTA28tnkVyfJ9uP297LZSdO3cyevRoMjOty7TvuOMOVq1aBcDGjRt56623AFiwYAEDBgwAYO3atWzbto1LL70UsH4wDB6sswz422/f3wfoOHAVWmw28SqXPBFWAR6oEwMuHQ3l62jAjTGGu+++m1/96ld+qUcppdyFVQvFdWLAnT9ODABceOGF7N+/n6KiIgDWrFnTel92djavvfYaAB9++CEnTpwAIDc3lzfeeIPycmtqmKqqKkpK2p0FUimlvBZWAe6vEwNte+CPPPIIMTExrFq1iquuuors7GxGjRrVuv2jjz7Khx9+yJQpU3jvvfcYNmwY8fHxjBs3jp///Od861vfYuLEiVxxxRUcOXLknP0tX76clJQUSktLmThxIvfdd59X9SuleqewaqG4nxhosrcQHRnBoL7RXp8YaG+kCFj97a+//vqc2xMSEvjggw+IjIxky5YtrFu3jj59rF7XzTffzM0333ze/S1btoxly5Z5VbNSSoVVgENgTgx05uDBg9x00004HA6io6N5+umng1pPb/eTa8YFuwSlgiLsAjwUZGZmsmPHjmCXoZx0GlnVW4VVD1yp9mwsOM7GAp2SQPU+egSuwt6K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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(x=x,y=c1, label='Edge 1')\n",
    "sns.scatterplot(x=x,y=c2, label='Edge 2')\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_ls.model[0] @ np.array([0.2,1]), model_ls.model[0] @ np.array([2.01,1])], \n",
    "         linewidth=2)\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_ls.model[1] @ np.array([0.2,1]), model_ls.model[1] @ np.array([2.01,1])], \n",
    "         color='orange',\n",
    "         linewidth=2)\n",
    "plt.axvline(1.01, ls = '--')\n",
    "plt.axvline(1.25)\n",
    "\n",
    "plt.title('Least Squares')\n",
    "plt.savefig('ex_figs/mse.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. SPO+"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "avg train loss 0.008786363722425384\n"
     ]
    }
   ],
   "source": [
    "learning_params = {\n",
    "    'gradient': 'spo_plus',\n",
    "    'step_size_fn': 'long_dynamic'\n",
    "}\n",
    "learner = SGDLearner(learning_params)\n",
    "oracle = ShortPathOracle()\n",
    "LSmodel = LinearModel(2, 2)\n",
    "model_spoplus = learner.learn(oracle, LSmodel, \n",
    "              tr_instances,\n",
    "              batch_size = len(tr_instances), epochs=200000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.18881393, -1.37705514],\n",
       "       [-1.18881393,  1.37705514]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_spoplus.model_avg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(x=x,y=c1, label='Edge 1')\n",
    "sns.scatterplot(x=x,y=c2, label='Edge 2')\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_spoplus.model[0] @ np.array([0.2,1]), model_spoplus.model[0] @ np.array([2.01,1])], \n",
    "         linewidth=2)\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_spoplus.model[1] @ np.array([0.2,1]), model_spoplus.model[1] @ np.array([2.01,1])], \n",
    "         color='orange',\n",
    "         linewidth=2)\n",
    "plt.axvline(1.23, ls = '--')\n",
    "plt.axvline(1.25)\n",
    "plt.title('SPO+')\n",
    "\n",
    "plt.savefig('ex_figs/spo.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Task Loss Reweighting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "avg train loss 0.0988630533064414\n"
     ]
    }
   ],
   "source": [
    "learning_params = {\n",
    "    'gradient': 'decision_loss_mse',\n",
    "    'step_size_fn': 'long_dynamic'\n",
    "}\n",
    "learner = SGDLearner(learning_params)\n",
    "oracle = ShortPathOracle()\n",
    "LSmodel = LinearModel(2, 2)\n",
    "model_taskloss = learner.learn(oracle, LSmodel, \n",
    "              tr_instances,\n",
    "              batch_size = len(tr_instances), epochs=200000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(x=x,y=c1, label='Edge 1')\n",
    "sns.scatterplot(x=x,y=c2, label='Edge 2')\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_taskloss.model[0] @ np.array([0.2,1]), model_taskloss.model_avg[0] @ np.array([2.01,1])], \n",
    "         linewidth=2)\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_taskloss.model[1] @ np.array([0.2,1]), model_taskloss.model_avg[1] @ np.array([2.01,1])], \n",
    "         color='orange',\n",
    "         linewidth=2)\n",
    "plt.axvline(1.26, ls = '--')\n",
    "plt.axvline(1.25)\n",
    "plt.title('Task Loss Reweighted w/ SGD')\n",
    "plt.savefig('ex_figs/task_loss_reweight.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Reweighting Effects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "def eval_task_loss(instance, model, oracle):\n",
    "    \n",
    "    estimated_cost = model.forward(instance['features'])\n",
    "    oracle.init_model(instance)\n",
    "    obj, opt_sol = oracle.solve(estimated_cost)\n",
    "    \n",
    "    return abs(instance['opt_val'] - instance['c'] @ opt_sol)\n",
    "\n",
    "oracle = ShortPathOracle()\n",
    "one_reweight_tr_instances = []\n",
    "for instance in tr_instances:\n",
    "    new_instance = instance.copy()\n",
    "    new_instance['weight'] = eval_task_loss(instance, model_ls, oracle)\n",
    "    one_reweight_tr_instances.append(new_instance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_reweight = []\n",
    "c1_reweight = []\n",
    "c2_reweight = []\n",
    "\n",
    "for instance in one_reweight_tr_instances:\n",
    "    if instance['weight'] > 0:\n",
    "        x_reweight.append(instance['features'][0])\n",
    "        c1_reweight.append(instance['c'][0])\n",
    "        c2_reweight.append(instance['c'][1])\n",
    "\n",
    "sns.scatterplot(x=x,y=c1, alpha = 0.3)\n",
    "sns.scatterplot(x=x,y=c2, alpha = 0.3)\n",
    "sns.scatterplot(x=x_reweight,y=c1_reweight, color = sns.color_palette()[0], label='Edge 1')\n",
    "sns.scatterplot(x=x_reweight,y=c2_reweight,color=sns.color_palette()[1],  label='Edge 2')\n",
    "\n",
    "plt.title('Reweighted Points (1 Step)')\n",
    "plt.savefig('ex_figs/weighted_data_points_1.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'c': array([3.74287433, 4.86518116]),\n",
       "  'features': array([1.05263158, 1.        ]),\n",
       "  'A': array([[1, 1]]),\n",
       "  'b': 1,\n",
       "  'var_type': 'integer',\n",
       "  'objective': 'min',\n",
       "  'opt_sol': array([1, 0]),\n",
       "  'opt_val': 3.742874325703455,\n",
       "  'weight': 1.122306830480233},\n",
       " {'c': array([4.47066584, 5.1498928 ]),\n",
       "  'features': array([1.14736842, 1.        ]),\n",
       "  'A': array([[1, 1]]),\n",
       "  'b': 1,\n",
       "  'var_type': 'integer',\n",
       "  'objective': 'min',\n",
       "  'opt_sol': array([1, 0]),\n",
       "  'opt_val': 4.470665840501531,\n",
       "  'weight': 0.6792269612000874}]"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tr_instances_filt = [x for x in one_reweight_tr_instances if x['weight'] > 0][0:2]\n",
    "tr_instances_filt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "avg train loss 4.106770083102493\n"
     ]
    }
   ],
   "source": [
    "learning_params = {\n",
    "    'gradient': 'LS',\n",
    "    'step_size_fn': 'constant',\n",
    "    'step_size': 0.001\n",
    "}\n",
    "learner = SGDLearner(learning_params)\n",
    "oracle = GurobiSolver()\n",
    "LSmodel = LinearModel(2, 2)\n",
    "model_ls_filt1 = learner.learn(oracle, copy.copy(model_ls), \n",
    "              tr_instances_filt,\n",
    "              batch_size = len(tr_instances_filt), epochs=150000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(x=x,y=c1, alpha = 0.3)\n",
    "sns.scatterplot(x=x,y=c2, alpha = 0.3)\n",
    "sns.scatterplot(x=x_reweight,y=c1_reweight, color = sns.color_palette()[0], label='Edge 1')\n",
    "sns.scatterplot(x=x_reweight,y=c2_reweight,color=sns.color_palette()[1],  label='Edge 2')\n",
    "\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_ls_filt1.model[0] @ np.array([0.2,1]), model_ls_filt1.model[0] @ np.array([2.01,1])], \n",
    "         linewidth=2)\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_ls_filt1.model[1] @ np.array([0.2,1]), model_ls_filt1.model[1] @ np.array([2.01,1])], \n",
    "         color='orange',\n",
    "         linewidth=2)\n",
    "plt.axvline(1.35, ls = '--')\n",
    "plt.axvline(1.25)\n",
    "plt.title('Least Squares Reweighted (1 Step)')\n",
    "plt.savefig('ex_figs/weighted_mse_1.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "oracle = ShortPathOracle()\n",
    "two_reweight_tr_instances = []\n",
    "for instance in tr_instances:\n",
    "    new_instance = instance.copy()\n",
    "    new_instance['weight'] = eval_task_loss(instance, model_ls_filt1, oracle)\n",
    "    two_reweight_tr_instances.append(new_instance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_reweight = []\n",
    "c1_reweight = []\n",
    "c2_reweight = []\n",
    "\n",
    "for instance in two_reweight_tr_instances:\n",
    "    if instance['weight'] > 0:\n",
    "        x_reweight.append(instance['features'][0])\n",
    "        c1_reweight.append(instance['c'][0])\n",
    "        c2_reweight.append(instance['c'][1])\n",
    "\n",
    "sns.scatterplot(x=x,y=c1, alpha = 0.3)\n",
    "sns.scatterplot(x=x,y=c2, alpha = 0.3)\n",
    "sns.scatterplot(x=x_reweight,y=c1_reweight, color = sns.color_palette()[0], label='Edge 1')\n",
    "sns.scatterplot(x=x_reweight,y=c2_reweight,color=sns.color_palette()[1],  label='Edge 2')\n",
    "\n",
    "plt.title('Reweighted Points (2 Step)')\n",
    "plt.savefig('ex_figs/weighted_data_points_2.pdf', dpi=400)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "avg train loss 5.8070023902744206\n"
     ]
    }
   ],
   "source": [
    "tr_instances_filt2 = [x for x in two_reweight_tr_instances if x['weight'] > 0]\n",
    "\n",
    "learning_params = {\n",
    "    'gradient': 'LS',\n",
    "    'step_size_fn': 'constant',\n",
    "    'step_size': 0.0001\n",
    "}\n",
    "learner = SGDLearner(learning_params)\n",
    "oracle = GurobiSolver()\n",
    "LSmodel = LinearModel(2, 2)\n",
    "model_ls_filt2 = learner.learn(oracle, copy.copy(model_ls_filt1), \n",
    "              tr_instances_filt2,\n",
    "              batch_size = len(tr_instances_filt2), epochs=75000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(x=x,y=c1, alpha = 0.3)\n",
    "sns.scatterplot(x=x,y=c2, alpha = 0.3)\n",
    "sns.scatterplot(x=x_reweight,y=c1_reweight, color = sns.color_palette()[0], label='Edge 1')\n",
    "sns.scatterplot(x=x_reweight,y=c2_reweight,color=sns.color_palette()[1],  label='Edge 2')\n",
    "\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_ls_filt2.model[0] @ np.array([0.2,1]), model_ls_filt2.model[0] @ np.array([2.01,1])], \n",
    "         linewidth=2)\n",
    "plt.plot([0.2,2.01], \n",
    "         [model_ls_filt2.model[1] @ np.array([0.2,1]), model_ls_filt2.model[1] @ np.array([2.01,1])], \n",
    "         color='orange',\n",
    "         linewidth=2)\n",
    "plt.axvline(1.25, ls = '--')\n",
    "plt.axvline(1.25)\n",
    "plt.title('Least Squares Reweighted (2 Step)')\n",
    "plt.savefig('ex_figs/weighted_mse_2.pdf', dpi=400)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
